<?php
class MyQuery {
	public $db;
	public $tabel;
	public $joinTabel;
	public $tabelVoorJoin;
	public $attributen;
	public $alleTabelAttributen;
	public $distinct;
	public $spelerId;
	public $uniekeId;
	public $jaar;
	public $team;
	public $nuBijTeam;
	public $controleerJaar;
	public $controleerTeam;
	public $jaarBijTeam;
	public $controleerTeamMetTabel;
	public $rechten;
	public $rechtenNu;
	public $getTeamNaam;
	public $getSpelerNaam;
	public $alleTeamgenoten;
	public $spelendLid;
	public $informatie;
	public $aanwezig;
	public $aanwezigheid;
	public $groupBy;
	public $orderBy;
	public $voorwaarde;
	public $limit;
	public $parameters;
	public $query;
	public $result;
	
	public function MyQuery($code) {
		$this->dbconnect($code);
		$this->resetValues();
	}
	private function dbconnect($code) {
		if($code == 'odanac') {
			//$this->db = new PDO('mysql:dbname=dewqa;host=localhost', 'asdf', 'asdf');
			$this->db = new PDO('mysql:dbname=joeri_senioren7;host=localhost', 'root', '');
			$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		}
	}
	
	// PUBLIC FUNCTINOS
	public function resetValues() {
		$this->tabel = '';
		$this->joinTabel = '';
		$this->tabelVoorJoin = '';
		$this->attributen = '';
		$this->alleTabelAttributen = false;
		$this->distinct = "";
		$this->spelerId = 0;
		$this->uniekeId = 0;
		$this->jaar = 0;
		$this->team = 0;
		$this->nuBijTeam = false;
		$this->controleerJaar = false;
		$this->jaarBijTeam = false;
		$this->controleerTeam = false;
		$this->controleerTeamMetTabel = '';
		$this->rechten = null;
		$this->rechtenNu = null;
		$this->getTeamNaam = false;
		$this->getSpelerNaam = false;
		$this->alleTeamgenoten = false;
		$this->spelendLid = false;
		$this->informatie = false;
		$this->aanwezig = false;
		$this->aanwezigheid = false;
		$this->groupBy = '';
		$this->orderBy = '';
		$this->voorwaarde = '';
		$this->limit = '';
		$this->parameters = null;
		$this->query = '';
		//$this->result = null;
	}
	
	public function makeSelectQuery($doQuery) {
		$this->query = '';
		$addKomma = false;
		// HEEFT DE TABEL EEN KOLOM MET DE NAAM DATUM?
		$tabelMetDatumKolom = false;
		if($this->tabel == 'Wedstrijd' || $this->tabel == 'Agenda' || $this->tabel == 'Bericht' || $this->tabel == 'Scheidsrechter'  || $this->tabel == 'Kantine') {
			$tabelMetDatumKolom = true;
		}
		// HEEFT DE TABEL EEN KOLOM MET DE NAAM TEAM?
		$tabelMetTeamKolom = false;
		if($this->tabel == 'Wedstrijd' || $this->tabel == 'Agenda' || $this->tabel == 'Bericht' || $this->tabel == 'Scheidsrechter'  || $this->tabel == 'Kantine') {
			$tabelMetTeamKolom = true;
		}
		
		// SELECT MET ATTRIBUTEN DIE OPGEHAALD MOETEN WRODEN */
		$this->query .= 'SELECT';
		if(!empty($this->distinct)) {		$this->query .= ' DISTINCT '.$this->distinct;	$addKomma = true;}
		if(!empty($this->attributen)) {		$this->query .=	($addKomma ? ', ' : ' ').$this->attributen;	$addKomma = true;}
		if($this->informatie) {				$this->query .=	($addKomma ? ', ' : ' ').'Informatie.bericht, Informatie.symbool, Informatie.gemaaktOp, Informatie.gewijzigdOp';	$addKomma = true;}
		if($this->getTeamNaam) {			$this->query .=	($addKomma ? ', ' : ' ').'Team.team';	$addKomma = true;}
		if($this->getSpelerNaam) {			$this->query .=	($addKomma ? ', ' : ' ').'Speler.voornaam, Speler.tussenvoegsel, Speler.achternaam';	$addKomma = true;}
		if($this->aanwezigheid) {			$this->query .= ($addKomma ? ', ' : ' ')."CASE WHEN (Afmelden.afmeldenId IS NOT NULL) THEN Afmelden.soort WHEN (Vakantie.vakantieId IS NOT NULL) THEN 4 ELSE NULL END AS afwezig, CASE WHEN (Afmelden.afmeldenId IS NOT NULL) THEN Afmelden.reden WHEN (Vakantie.vakantieId IS NOT NULL) THEN Vakantie.opmerking ELSE NULL END AS reden";	$addKomma = true;}
		if($this->alleTabelAttributen) {	$this->query .=	($addKomma ? ', ' : ' ').$this->tabel.'.*';	$addKomma = true;}
		$this->query .= ' FROM';
		
		$addKomma = false;
		/* VRAAG OP WELKE TABELLEN GEBRUIKT WORDEN VOOR DEZE QUERY */
		// als het team gecontroleerd moet worden, maar er is een tabel geselecteerd waar geen datum kolom in zit, wordt de wedstrijd tabel toegevoegd
		if($this->controleerTeam && $tabelMetDatumKolom == false && $this->tabel <> 'Wedstrijd' && $this->tabelVoorJoin <> 'Wedstrijd') {
			$this->query .= ($addKomma ? ',' : '').' Wedstrijd';
			$addKomma = true;
		}
		// als je de aanwezigheid wilt weten, haal dan de afmelden en vakantie tabel op
		if($this->aanwezig) {
			$this->query .= ($addKomma ? ',' : '').' '.($this->tabelVoorJoin <> 'Afwezig' ? 'Afwezig' : '').($this->tabelVoorJoin <> 'Vakantie' ? ($this->tabelVoorJoin <> 'Afwezig' ? ', Vakantie' : 'Vakantie') : '');
			$addKomma = true;
		}
		// als je de teamnaam wilt weten, haal de team tabel op
		if($this->getTeamNaam && $this->tabel <> 'Team' && $this->tabelVoorJoin <> 'Team') {
			$this->query .= ($addKomma ? ',' : '').' Team';
			$addKomma = true;
		}
		// als je de teamnaam wilt weten, haal de team tabel op
		if($this->getSpelerNaam && $this->tabel <> 'Speler' && $this->tabelVoorJoin <> 'Speler') {
			$this->query .= ($addKomma ? ',' : '').' Speler';
			$addKomma = true;
		}
		// als het team of seizoen gecontroleerd moet worden, haal dan de teambeheer tabel op
		if(($this->controleerJaar || $this->controleerTeam || isset($this->rechtenNu) || $this->nuBijTeam) && (empty($this->tabelVoorJoin) || $this->tabelVoorJoin <> 'Teambeheer') && $this->tabel <> 'Teambeheer') {
			$this->query .= ($addKomma ? ',' : '').' Teambeheer';
			$addKomma = true;
		}
		// voeg de join tabel toe
		if(!empty($this->joinTabel)) {
			$this->query .= ($addKomma ? ',' : '').' '.$this->joinTabel;
			$addKomma = true;
		}
		// de eigen tabel toevoegen
		if($this->tabelVoorJoin <> $this->tabel) {
			$this->query .= ($addKomma ? ',' : '').' '.$this->tabel;
			$addKomma = true;
		}
		// voeg de tabel voor de join toe
		if(!empty($this->tabelVoorJoin)) {
			$this->query .= ($addKomma ? ',' : '').$this->tabelVoorJoin;
			$addKomma = true;
		}
		
		/* INFORMATIE --------------------------- */
		if($this->informatie) {
			$this->query .= ' LEFT JOIN Informatie ON Informatie.'.lcfirst ($this->tabel).'Id = '.$this->tabel.'.'.lcfirst($this->tabel).'Id';
		}
		/* VERKRIJG ALLE TEAMGENOTEN DIE IN ....JAAR BIJ HET TEAM SPELEN ------ */
		if($this->alleTeamgenoten) {
			$this->query .= ' LEFT JOIN Teambeheer AS Teamgenoten ON Teamgenoten.teamId = Teambeheer.teamId AND Teamgenoten.van >= Teambeheer.van AND (Teamgenoten.tot IS NULL OR Teamgenoten.tot >= Teamgenoten.van)';
		}
		/* AANWEZIGHEID ------------------------- */
		if($this->aanwezigheid) {
			if($this->tabel == 'Agenda') {
				$this->query .= ' LEFT JOIN Afmelden ON Agenda.agendaId = Afmelden.agendaId AND Afmelden.spelerId = :spelerId LEFT JOIN Vakantie ON Vakantie.spelerId = :spelerId AND Agenda.datum >= Vakantie.van AND Agenda.datum <= Vakantie.tot';
			}else {
				$this->query .= ' LEFT JOIN Afmelden ON Wedstrijd.wedstrijdId = Afmelden.wedstrijdId AND Afmelden.spelerId = :spelerId LEFT JOIN Vakantie ON Vakantie.spelerId = :spelerId AND Wedstrijd.datum >= Vakantie.van AND Wedstrijd.datum <= Vakantie.tot';
			}
		}
		/* BEKIJK OF JE HET RECHT HEBT OM ------- */
		
		/* MAAK DE VOORWAARDES ------------------ */
		$addWhere = true;
		if($this->uniekeId > 0) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').$this->tabel.'.'.lcfirst($this->tabel).'Id = :uniekeId';
			$addWhere = false;
		}
		if($this->team > 0 && $this->nuBijTeam == false) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').($tabelMetTeamKolom ? $this->tabel : 'Wedstrijd').'.teamId = :team';
			$addWhere = false;
		}
		if($this->nuBijTeam) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Teambeheer.spelerId = :spelerId'.($this->team > 0 ? ' AND Teambeheer.teamId = :team' : '').' AND Teambeheer.van <= NOW() AND (Teambeheer.tot IS NULL OR Teambeheer.tot >= NOW())';
			$addWhere = false;
		}
		if($this->jaar > 0 && $this->controleerJaar) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Teambeheer.spelerId = :spelerId'.($this->team > 0 ? ' AND Teambeheer.teamId = :team' : '').' AND YEAR(Teambeheer.van) <= :jaar AND (Teambeheer.tot IS NULL OR YEAR(Teambeheer.tot) >= :jaar)';
			$addWhere = false;
		}
		if($this->jaar > 0 && empty($this->controleerJaar)) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'YEAR('.($tabelMetDatumKolom ? $this->tabel : 'Wedstrijd').'.datum) = :jaar';
			$addWhere = false;
		}
		if(isset($this->rechten) && isset($this->spelerId)) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Teambeheer.spelerId = :spelerId AND Teambeheer.rechten & (b\'1\' << :rechten)';
			$addWhere = false;
		}
		if(isset($this->rechtenNu)) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').(!empty($this->spelerId) ? 'Teambeheer.spelerId = :spelerId' : 'Teambeheer.teamId = '.$this->tabel.'.teamId').' AND Teambeheer.rechten & (b\'1\' << :rechtenNu) AND Teambeheer.van <= NOW() AND (Teambeheer.tot >= NOW() OR Teambeheer.tot IS NULL)';
			$addWhere = false;
		}
		if($this->controleerTeam) {
			if($tabelMetDatumKolom){	$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Teambeheer.spelerId = :spelerId AND Teambeheer.teamId = '.$this->tabel.'.teamId AND Teambeheer.van <= '.$this->tabel.'.datum AND (Teambeheer.tot IS NULL OR Teambeheer.tot >= '.$this->tabel.'.datum)';}
			else {						$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Teambeheer.spelerId = :spelerId AND Teambeheer.teamId = Wedstrijd.teamId AND Teambeheer.van <= Wedstrijd.datum AND (Teambeheer.tot IS NULL OR Teambeheer.tot >= Wedstrijd.datum)';}
			$addWhere = false;
		}
		//if($this->controleerTeambeheerJaar) {
			//$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Teambeheer.spelerId = :spelerId AND Teambeheer.van <= NOW() AND (Teambeheer.tot IS NULL OR Teambeheer.tot >= '.$this->tabel.'.datum)';}
		//}
		if($this->getTeamNaam) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Team.teamId = '.($this->tabel <> 'Team' ? $this->tabel.'.teamId' : 'Teambeheer.teamId');
			$addWhere = false;
		}
		if($this->getSpelerNaam) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Speler.spelerId = '.($this->alleTeamgenoten ? 'Teamgenoten.spelerId' : 'Teambeheer.spelerId');
			$addWhere = false;
		}
		if($this->spelendLid) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').'Teambeheer.spelendLid = 1';
			$addWhere = false;
		}
		if(!empty($this->voorwaarde)) {
			$this->query .= ' '.($addWhere ? 'WHERE ' : 'AND ').$this->voorwaarde;
			$addWhere = false;
		}
		if(!empty($this->groupBy)) {
			$this->query .= ' GROUP BY '.$this->groupBy;
		}
		if(!empty($this->orderBy)) {
			$this->query .= ' ORDER BY '.$this->orderBy;
		}
		if(!empty($this->limit)) {
			$this->query .= ' LIMIT '.$this->limit;
		}
		
		if(isset($doQuery) && $doQuery == true) {
			$this->doQuery();
		}
	}
	
	public function makeInsertQuery($doQuery) {
		if(isset($this->parameters)) {
			$values = array();
			$this->query = 'INSERT INTO '.$this->tabel.' (';
			
			$eersteParameter = true;
			foreach($this->parameters as $param) {
				$this->query .= ($eersteParameter ? '' : ', ').$param['name'];
				$eersteParameter = false;
			}
			
			$eersteParameter = true;
			$this->query .= ') VALUES(';
			for($i = 1; $i <= count($this->parameters); $i++) {
				$this->query .= ($eersteParameter ? '' : ', ').'?';
				$eersteParameter = false;
			}
			$this->query .= ')';
			
			if(isset($doQuery)) {
				return $this->doInsertQuery();
			}
			return true;
		}
		return false;
	}
	
	public function makeUpdateQuery($doQuery) {
		if(isset($this->parameters)) {
			$values = array();
			$this->query = 'UPDATE '.$this->tabel.' SET ';
			
			$eersteParameter = true;
			foreach($this->parameters as $param) {
				$this->query .= ($eersteParameter ? '' : ', ').$param['name'].' = ?';
				$eersteParameter = false;
			}
			
			//$eersteParameter = true;
			//$this->query .= ') VALUES(';
			//for($i = 1; $i <= count($this->parameters); $i++) {
				//$this->query .= ($eersteParameter ? '' : ', ').'?';
				//$eersteParameter = false;
			//}
			$this->query .= ' WHERE '.$this->tabel.'.'.lcfirst($this->tabel).'Id = ?';
			
			if(isset($doQuery)) {
				return $this->doUpdateQuery();
			}
			return true;
		}
		return false;
	}
	
	public function makeDeleteQuery($doQuery) {
		$values = array();
		$this->query = 'DELETE FROM '.$this->tabel.' WHERE ';
		
		if(isset($this->voorwaarde)) {
			$this->query .= $this->voorwaarde;
		}
		if(isset($this->uniekeId)) {
			$this->query .= ' '.$this->tabel.'.'.lcfirst($this->tabel).'Id = ?';
		}
		
		if(isset($doQuery)) {
			return $this->doDeleteQuery();
		}
		return true;
	}
	
	public function doQuery() {
		// PREPARE DE QUERY
		$this->result = $this->db->prepare($this->query);
		
		// SET DE VOORGEDEFINIEERDE PARAMATERS
		if($this->uniekeId > 0) {			$this->result->bindParam(':uniekeId', $this->uniekeId, PDO::PARAM_INT);}
		if($this->team > 0) {				$this->result->bindParam(':team', $this->team, PDO::PARAM_INT);}
		if($this->jaar > 0) {				$this->result->bindParam(':jaar', $this->jaar, PDO::PARAM_INT);}
		if(isset($this->rechten) && !empty($this->spelerId)) {	$this->result->bindParam(':rechten', $this->rechten, PDO::PARAM_INT);}
		if(isset($this->rechtenNu)) {		$this->result->bindParam(':rechtenNu', $this->rechtenNu, PDO::PARAM_INT);}
		if(!empty($this->spelerId) && ($this->controleerTeam || $this->alleTeamgenoten || isset($rechten) || isset($this->rechtenNu) || $this->nuBijTeam || $this->controleerJaar)) {	$this->result->bindParam(':spelerId', $this->spelerId, PDO::PARAM_INT);}
		
		//PRINT DE PARAMETERS
		/*$komma = false;
		echo "<br>Parameters -> ";
		if($this->uniekeId > 0) {			echo ($komma ? ", " : "").":uniekeId"; $komma = true;}
		if($this->team > 0) {				echo ($komma ? ", " : "").":team"; $komma = true;}
		if($this->jaar > 0) {				echo ($komma ? ", " : "").":jaar"; $komma = true;}
		if(isset($this->rechten) && !empty($this->spelerId)) {	echo ($komma ? ", " : "").":rechten"; $komma = true;}
		if(isset($this->rechtenNu)) {		echo ($komma ? ", " : "").":rechtenNu"; $komma = true;}
		if(!empty($this->spelerId) && ($this->controleerTeam || $this->alleTeamgenoten || isset($rechten) || isset($this->rechtenNu) || $this->nuBijTeam)) {echo ($komma ? ", " : "").":spelerId"; $komma = true;}
		echo "<br><br>";*/
		
		// SET DE EIGEN GEMAAKTE PARAMATERS
		if(isset($this->parameters)) {
			foreach($this->parameters as $param) {
				$this->result->bindParam(':'.$param['name'], $param['value'], PDO::PARAM_STR);
			}
		}
		
		try {$this->result->execute();		return true;}	// EXECUTION SUCCES
		catch (PDOException $e) {			echo $e."<br>".$this->query."<br><br>"; return false;}	// EXECUTION FAILED
	}
	
	public function doInsertQuery() {
		// PREPARE DE QUERY
		$this->result = $this->db->prepare($this->query);
		
		// SET DE EIGEN GEMAAKTE PARAMATErs
		$i = 1;
		foreach($this->parameters as $param) {
			$this->result->bindValue($i, $param['value'], $param['type']);
			$this->query = preg_replace('/\?/', "'".$param['value']."'", $this->query, 1);
			$i++;
		}
		
		try {$this->result->execute();		return true;}	// EXECUTION SUCCES
		catch (PDOException $e) {			echo $e."<br>".$this->query."<br><br>"; return false;}	// EXECUTION FAILED
	}

	public function doUpdateQuery() {
		// PREPARE DE QUERY
		$this->result = $this->db->prepare($this->query);
		
		// SET DE EIGEN GEMAAKTE PARAMATERS
		$i = 1;
		foreach($this->parameters as $param) {
			$this->result->bindValue($i, $param['value'], $param['type']);
			$i++;
		}
		
		// SET DE UNIEKEID PARAMETER TOT SLOT
		$this->result->bindValue($i, $this->uniekeId, PDO::PARAM_INT);
		
		try {$this->result->execute();		return true;}	// EXECUTION SUCCES
		catch (PDOException $e) {			echo $e."<br>".$this->query."<br><br>"; return false;}	// EXECUTION FAILED
	}
	
	public function doDeleteQuery() {
		// PREPARE DE QUERY
		$this->result = $this->db->prepare($this->query);
		
		$i = 1;
		// SET DE EIGEN GEMAAKTE PARAMATERS
		if(isset($this->parameters)) {
			foreach($this->parameters as $param) {
				$this->result->bindValue($i, $param['value'], $param['type']);
				$i++;
			}
		}
		
		// SET DE UNIEKEID PARAMETER TOT SLOT
		if(isset($this->uniekeId)) {
			$this->result->bindValue($i, $this->uniekeId, PDO::PARAM_INT);
		}
		
		try {$this->result->execute();		return true;}	// EXECUTION SUCCES
		catch (PDOException $e) {			echo $e."<br>".$this->query."<br><br>"; return false;}	// EXECUTION FAILED
	}
	
	public function fetchRow($attribute=null) {
		if(empty($attribute)) {
			return $this->result->fetch(PDO::FETCH_ASSOC);
		}else {
			$row = $this->result->fetch(PDO::FETCH_ASSOC);
			return $row[$attribute];
		}
	}
	
	public function attributeEqualTo($attribute, $value) {
		if($this->isValidResult()) {
			while($row = $this->result->fetch(PDO::FETCH_ASSOC)) {
				if($row[$attribute] == $value) {
					return true;
				}
			}
		}
		return false;
	}
	
	public function isValidResult() {
		if(!empty($this->result) && $this->result->rowCount() > 0) {
			return true;
		}else {
			return false;
		}
	}
	
	public function printQuery() {		
		if($this->uniekeId > 0) {			$this->query = str_replace(':uniekeId', "'".$this->uniekeId."'", $this->query);}
		if($this->team > 0) {				$this->query = str_replace(':team', "'".$this->team."'", $this->query);}
		if($this->jaar > 0) {				$this->query = str_replace(':jaar', "'".$this->jaar."'", $this->query);}
		if(isset($this->rechtenNu)) {		$this->query = str_replace(':rechtenNu', "'".$this->rechtenNu."'", $this->query);}
		if($this->controleerTeam || $this->alleTeamgenoten || (isset($this->rechtenNu) && !empty($this->spelerId)) || $this->nuBijTeam) {	$this->query = str_replace(':spelerId', "'".$this->spelerId."'", $this->query);}
		
		// SET DE EIGEN GEMAAKTE PARAMATERS
		if(isset($this->parameters)) {
			foreach($this->parameters as $param) {
				$this->query = str_replace(':'.$param['name'], "'".$param['value']."'", $this->query);
			}
		}
		echo $this->query;
	}
}

if(isset($in_site) && $in_site == 'dassnfu') {
	$myQuery = new MyQuery('odanac');
}
?>